home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 145
/
Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z
/
Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin
/
games
/
spassion
/
source.lzh
/
SOURCE
/
FuncEnemy
/
BOSS03.C
< prev
next >
Wrap
Text File
|
2000-03-27
|
10KB
|
304 lines
/*
#include <stdio.h>
#include <iocslib.h>
*/
/* ドラゴンの腕で攻撃 */
#include <xsp2lib.h>
#include "../SPASSION.H"
#include "../player.h"
#include "../enemy.h"
#include "../eshot.h"
#include "../effect.h"
#include "../priority.h"
#include "../sound.h"
#include "../entry.h"
#include "../SUB.H"
#ifndef NULL
#define NULL ((void *) 0)
#endif
#define P_X (*((short *) (&player[0].lx))) /*lxの上位ワード*/
#define P_Y (*((short *) (&player[0].ly))) /*lyの上位ワード*/
#define PALET_MAIN 0x0700
static short MoveEnemyBoss03(ENEMY *);
/*static void TiniEnemyBoss03(ENEMY *);*/
/* 左半分 */
static HIT_XY4 hit_left_p={-20-PLAYER_HIT_X,-15-PLAYER_HIT_Y,PLAYER_HIT_X,15+PLAYER_HIT_Y};
static HIT_XY4 hit_leftup_s= {-20,-15,0,-12};
static HIT_XY4 hit_leftdown_s={-20, 12,0,15};
/* 脳の部分 */
static HIT_XY4 hit_right_p={-PLAYER_HIT_X,-21-PLAYER_HIT_Y,21+PLAYER_HIT_X,21+PLAYER_HIT_Y};
static HIT_XY4 hit_right_s={0,-21,21,21};
/* 砲身の部分 */
static HIT_XY4 hit_p[5]={999,999,999,999, -24,-6,-20,6, -28,-6,-20,6, -32,-6,-20,6, -36,-6,-20,6};
/* コア */
extern HIT_XY4 hit_core_p[5];
extern HIT_XY4 hit_core_o[5];
extern HIT_XY4 hit_core_s[5];
extern HIT_XY4 nohit;
static ENEMY dummy;
static unsigned char seed=0;
void InitEnemyBoss03Hit(ENEMY *ene)
{
short i;
for(i=0;i<5;i++){
hit_p[i].x1=hit_p[i].x1-PLAYER_HIT_X;hit_p[i].y1=hit_p[i].y1-PLAYER_HIT_Y;
hit_p[i].x2=hit_p[i].x2+PLAYER_HIT_X;hit_p[i].y2=hit_p[i].y2+PLAYER_HIT_Y;
}
}
void InitEnemyBoss03(ENEMY *ene)
{
ene->vx = -65536/2;
ene->vy = 0;
ene->hit_p[0] =&hit_left_p;ene->hit_p[1] =&hit_left_p; ene->hit_p[2]=&hit_right_p; ene->hit_p[3]=&hit_p[0]; ene->hit_p[4]=NULL;
ene->hit_o[0] =&nohit; ene->hit_o[1]=&nohit; ene->hit_o[2]=&nohit; ene->hit_o[3]=&nohit; ene->hit_o[4]=NULL;
ene->hit_s[0] =&hit_leftup_s;ene->hit_s[1] =&hit_leftdown_s; ene->hit_s[2]=&hit_right_s; ene->hit_s[3]=&nohit; ene->hit_s[4]=NULL;
ene->pt = obj_boss3;
ene->info = PALET_MAIN | PRIORITY_BOSS;
ene->work=0;
ene->no_dead = 0;
ene->func_enemy_move = MoveEnemyBoss03;
/* ene->func_enemy_tini = TiniEnemyBoss03;*/
ene->parts1 = ene->parts2 = &dummy; /* 腕が出てくるまでの仮のパーツ */
dummy.child_death =0;
ene->parts3=MakeEnemy(ENEMY_CORE , ene->x-8, ene->y ,1, ene); /* コア */
#if 0
ene->parts3->child=MakeEnemy(ENEMY_SHIELD , 0, 0,0, ene->parts3); /* これはダミー */
ene->parts3->child->child_death = 1;
ene->parts3->child->pt=0;
ene->parts3->child->hit_p[0]=NULL;
#endif
entry_counter_stop = !0; /* エントリーカウンター停止 */
}
static short MoveEnemyBoss03( ENEMY *ene )
{
short anim_num,angle1,angle2;
short vxy[8]={0xFF00,0xFFFE,0xFE01,0xFEFF};
short pow,i;
ESHOT *eshot;
short Wait( ENEMY *ene, short time );
/* 爆発 */
if( ene->dead_count ){
ene->dead_count++;
if( ene->y > 256+30+16 ){
ene->child_death=1;
if(!ene->parent){
entry_counter_stop = 0; /* エントリーカウンター停止解除 */
return (0); /* 消去 */
}else{ /* ラスボスに呼び出された場合は解除しない */
if( ene->child_kill )
return (0); /* 消去 */
}
}else{
if( !(ene->dead_count%20) ){
short exp_x,exp_y,x,y;
exp_x=rndtable[seed++]&31;seed&=255;
exp_y=rndtable[seed++]&31;seed&=255;
if( rndtable[seed++]>128 ){exp_x*=-1;exp_y*=-1;seed&=255;}
MakeEffect(EFFECT_EXPLMINI, 0, (x=ene->x+exp_x-8), (y=ene->y+exp_y-8));
SetSE(SE_EXPL_MBOSS); /* 爆発音 */
if( !(ene->dead_count%60) ){
MakeEffect(EFFECT_EXPL, 0, ene->x, ene->y);
MakeEffect(EFFECT_HAHENMINI, 0, x, y);
SetSE(SE_EXPL_BOSS); /* 爆発音 */
}
}
ene->y = (ene->ly += 65536/2) >> 16;
xobj_set_st(ene);
return (1);
}
}
/* 速度を足して上位ワード(固定整数部)だけ取り出す */
ene->x = (ene->lx += ene->vx) >> 16;
ene->y = (ene->ly += ene->vy) >> 16;
ene->parts3->x=((ene->parts3->lx=ene->lx-4*65536)>>16)-8;
ene->parts3->y=((ene->parts3->ly=ene->ly )>>16)-8;
if( rndtable[seed++]>250 ){
seed&=255;
MakeEnemy(ENEMY_BRAIN , 256+32 , rndtable[seed]+16, vxy[rndtable[seed]&3], ene);
}
switch (ene->state){
case 0:
switch (ene->work){
case 0: /* 登場 */
if( ENE_X < 192+16 ){
ene->vx = 0;
if( Wait( ene, 180 ) ){ /*ドラゴンを取り込む */
ene->vx = -65536/2;
ene->work++;
}
}
break;
case 1: /* 中央へ */
if( ENE_X < 144+16 ){
ene->vx = 0;
/* ドラゴンの腕を出す */
if( Wait( ene, 60 ) ){
ene->parts1=MakeEnemy(ENEMY_BOSSARM, ene->x, ene->y-4,0x004, ene);
ene->parts2=MakeEnemy(ENEMY_BOSSARM, ene->x, ene->y+4,0x104, ene);
ene->work++;
}
}
break;
case 2:
/* ドラゴンの腕が2体とも破壊されたら次の動きへ */
if( ene->parts1->child_death && ene->parts2->child_death ){
ene->work=0;
ene->state++;
}
}
break;
case 1:
switch (ene->work){
case 0: /* 画面右に移動 */
ene->vx= 2*65536;
if( ENE_X > 200+16 ){
ene->vx= 0;
ene->work++;
}
break;
case 1: /* プレイヤーの方に狙いをつける */
if( ENE_Y < player[0].y )
ene->vy= 4*65536;
else
ene->vy=-4*65536;
for(i=0;i<3;i++){
pow=(rndtable[seed++]&0xF)+10;
seed&=255;
angle1=calc_direction( ENE_X, ENE_Y, P_X+CENTER_X, P_Y );
if( ENE_X < player[0].x)
angle1/=4;
else
angle1=angle1/4+192;
MakeEShot(ESHOT_PARABOLA, ENE_X, ENE_Y, pow, angle1, 4,0,ene);
MakeEShot(ESHOT_PARABOLA, ENE_X, ENE_Y, pow, (angle1-12)&255, 4,0,ene);
MakeEShot(ESHOT_PARABOLA, ENE_X, ENE_Y, pow, (angle1+12)&255, 4,0,ene);
SetSE(SE_ESHOT_PARABOLA); /* 敵ショット音 */
}
ene->work++;
break;
case 2: /* プレイヤーの方に移動 */
if( rndtable[seed++]>240){
pow=(rndtable[seed++]&0xF)+10;
seed&=255;
angle1=calc_direction( ENE_X, ENE_Y, P_X+CENTER_X, P_Y );
if( ENE_X < player[0].x)
angle1/=4;
else
angle1=angle1/4+192;
MakeEShot(ESHOT_PARABOLA, ENE_X, ENE_Y, pow, angle1, 4,0,ene);
MakeEShot(ESHOT_PARABOLA, ENE_X, ENE_Y, pow, (angle1-12)&255, 4,0,ene);
MakeEShot(ESHOT_PARABOLA, ENE_X, ENE_Y, pow, (angle1+12)&255, 4,0,ene);
SetSE(SE_ESHOT_PARABOLA); /* 敵ショット音 */
}
if( (ene->vy > 0 && ENE_Y > player[0].y) /* プレイヤーを追い越した */
|| (ene->vy < 0 && ENE_Y < player[0].y)
|| (ene->vy < 0 && ENE_Y < 32 + 16 )
|| (ene->vy > 0 && ENE_Y > 224 + 16) ){
ene->vy=0;
ene->work++;
}
break;
case 3: /* 時間稼ぎ */
if( Wait( ene, 20 ) ){
SetSE(SE_EXPL_BATTERY); /* 砲身を出す音(ボコボコ) */
ene->work++;
}
break;
case 4: /* 砲身を出す */
anim_num=(++ene->anim_count)/8;
ene->pt = obj_boss3+anim_num;
ene->parts3->pt=obj_obj+anim_num;
ene->hit_p[3] = &hit_p[anim_num];
if( anim_num == 4 )
ene->work++;
break;
case 5: /* 太いレーザー */
if( Wait( ene, 60 ) ){
MakeEShot(ESHOT_LASER00, ENE_X, ENE_Y, 5, angle1=calc_direction( ENE_X, ENE_Y, P_X+CENTER_X, P_Y ), 4,0,ene);MakeEShot(ESHOT_CUTTER, ENE_X, ENE_Y,15, angle1, 4,0,ene);
MakeEShot(ESHOT_LASER00, ENE_X, ENE_Y, 5, angle2=(angle1-32)&255, 4,0,ene);MakeEShot(ESHOT_CUTTER, ENE_X, ENE_Y,15, angle2, 4,0,ene);
MakeEShot(ESHOT_LASER00, ENE_X, ENE_Y, 5, angle2=(angle1-24)&255, 4,0,ene);MakeEShot(ESHOT_CUTTER, ENE_X, ENE_Y,15, angle2, 4,0,ene);
MakeEShot(ESHOT_LASER00, ENE_X, ENE_Y, 5, angle2=(angle1-16)&255, 4,0,ene);MakeEShot(ESHOT_CUTTER, ENE_X, ENE_Y,15, angle2, 4,0,ene);
MakeEShot(ESHOT_LASER00, ENE_X, ENE_Y, 5, angle2=(angle1- 8)&255, 4,0,ene);MakeEShot(ESHOT_CUTTER, ENE_X, ENE_Y,15, angle2, 4,0,ene);
MakeEShot(ESHOT_LASER00, ENE_X, ENE_Y, 5, angle2=(angle1+ 8)&255, 4,0,ene);MakeEShot(ESHOT_CUTTER, ENE_X, ENE_Y,15, angle2, 4,0,ene);
MakeEShot(ESHOT_LASER00, ENE_X, ENE_Y, 5, angle2=(angle1+16)&255, 4,0,ene);MakeEShot(ESHOT_CUTTER, ENE_X, ENE_Y,15, angle2, 4,0,ene);
MakeEShot(ESHOT_LASER00, ENE_X, ENE_Y, 5, angle2=(angle1+24)&255, 4,0,ene);MakeEShot(ESHOT_CUTTER, ENE_X, ENE_Y,15, angle2, 4,0,ene);
MakeEShot(ESHOT_LASER00, ENE_X, ENE_Y, 5, angle2=(angle1+32)&255, 4,0,ene);MakeEShot(ESHOT_CUTTER, ENE_X, ENE_Y,15, angle2, 4,0,ene);
eshot=MakeEShot(ESHOT_LASEREX, ENE_X, ENE_Y, 5, 128, 4,0,ene);
eshot->box_x=-38-16;eshot->box_y=-16;
SetSE(SE_EXLASER); /* 敵ショット音 */
ene->work++;
}
break;
case 6: /* 時間稼ぎ */
if( Wait( ene, 120 ) ){
ene->vy=0;
ene->work++;
}
break;
case 7: /* 砲身をしまう */
anim_num=(--ene->anim_count)/8;
ene->pt = obj_boss3+anim_num;
ene->parts3->pt=obj_obj+anim_num;
ene->hit_p[3] = &hit_p[anim_num];
if( anim_num == 0 ){
ene->anim_count=0;
ene->work=1;
}
}
break;
}
#if 0
ene->state = 1;
ene->lx = 128*65536;
ene->ly = 128*65536;
ene->vx = 0;
ene->vy = 0;
if( BITSNS(0x04) & BIT(1) ){
while( BITSNS(0x04) & BIT(1) );
entry_counter_stop = 0;
return (0);
}
#endif
/* コアが破壊された */
if( ene->parts3->child_death ){
MakeEffect(EFFECT_EXPL, 0, ene->x, ene->y);
SetSE(SE_EXPL_BOSS); /* 爆発音 */
MakeEffect (EFFECT_HAHEN, 0, ene->x, ene->y);
if(!eshot_erase)
eshot_erase = ESHOT_ERASE; /* 弾消し */
ene->player->score += 15;
ene->parts1->child_kill=1;
ene->parts2->child_kill=1;
ene->hit_p[0]=NULL;
ene->dead_count=1;
}
xobj_set_st(ene);
xsp_set_st(ene->parts3);
return(1);
}
/*
static void TiniEnemyBoss03(ENEMY * p)
{
}
*/